class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.empty())  return vector<int>(0,0);

        /*
        根据画图观察，每次扫描，无论是纵向还是横向，都是达到行列的边界点停止；
        因此本题关键在于动态边界点的设置
        */
        vector<int> result;
        int iStart = 0;  //初始开始行
        int iEnd = matrix.size() - 1;  //初始结束行
        int jStart = 0;  //初始开始列
        int jEnd = matrix[0].size() - 1;  //初始结束列
        int i = iStart;
        int j = jStart;

        //右->下->左->上为一次循环
        while(iStart <= iEnd || jStart <= jEnd){
            if(j > jEnd)  break;
            for(; j <= jEnd; ++j){
                result.push_back(matrix[i][j]);
            }
            ++iStart;  //第iStart行已经过
            --j;  //j重新回到结尾
            ++i;  //从++i行开始输出

            if(i > iEnd)  break;
            for(; i <= iEnd; ++i){
                result.push_back(matrix[i][j]);
            }
            --jEnd;
            --j;
            --i;

            if(j < jStart)  break;
            for(; j >= jStart; --j){
                result.push_back(matrix[i][j]);
            }
            --iEnd;
            ++j;
            --i;

            if(i < iStart)  break;
            for(; i >= iStart; --i){
                result.push_back(matrix[i][j]);
            }
            ++jStart;
            ++j;
            ++i;
        }
        return result;
    }
};